package Main;


/**
 * La classe Simulator est responsable de la dynamique du jeu.
 *
 * @author Emmanuel
 */
public class Simulator implements Runnable {
    
    private static final int BEGINNIG_TIME=10; // 10
    /**
     * Le temp entre deux tour de boucle de play en miliseconde.
     */
    private static int PAUSE_TIME=10;
    
    /**
     * Le drawer s'occupe de representer a l'ecran l'etat actuelle du jeu.
     */
    
    private Drawer drawer;
    /**
     * Le niveau sur lequel le joueur joue.
     */
    private Niveau niveau;
    
    /**
     * Le personnage du joueur.
     */
    private Personnage perso;
    
    private boolean quit=false;

    
    public Simulator(Niveau n, Drawer d, Personnage p) {
        this.drawer=d;
        this.niveau=n;
        this.perso=p;
    }
    
    
    @Override
    public void run() {
        
        /*
         * La premiere fois qu'on touche cet obstacle ?
         */
        boolean firstTime=false;
        Obstacle o;
        
        while(!quit) {
            
            if(perso.getPosition().getY()>0 && !perso.isSaute()) {
                perso.setChuteLibre(true);
            }
            else {
                perso.setChuteLibre(false);
            }
            
            o = niveau.getNext();
            if (o==null) {
                System.out.println("run : plus d'obstacle");
                return;
            }
            o.playSound(perso); // joue le son si necessaire
            TypeColision tc=o.collision(perso);
            if (tc==TypeColision.SOLIDE) {
                perso.getPosition().setY(o.getPosition().getY()+o.getSizeY()-1);
                perso.setChuteLibre(false);
                if(firstTime) {
                    firstTime=false;
                    perso.saute(false);
                }
            }
            else if(tc==TypeColision.MORTELLE) {
                perso.loseLife();
                if (perso.isDead()) {
                    quit();
                }
                if(firstTime) {
                    firstTime=false;
                }
            }
            else {
                firstTime=true;
            }
            perso.deplacer();
            
            drawer.deplacer();
            drawer.repaint();
            
            // if(arcade) {
            //this.updatePauseTime();
            // }
            
            try {
                Thread.sleep(PAUSE_TIME);
            } catch (Exception e) {
                // je sais pas trop quoi faire...
                System.err.println("Cannot sleep...");
            }
        }
    }
    
    /**
     * Stop le simulator.
     */
    public synchronized void quit() {
        System.out.println("quit. nb vie="+perso.getVie());
        PAUSE_TIME=BEGINNIG_TIME;
        this.quit=true;
    }
    
    private synchronized void updatePauseTime() {
        // TODO updatePauseTime marche pas trop bien (accelere puis ralenti ect...)
        int t=drawer.getParcouru()/5000;
        int u=(drawer.getParcouru()-5*5000)/5000;
        
        if((BEGINNIG_TIME-t)>=5) {
            PAUSE_TIME=BEGINNIG_TIME-t;
        }
        else if(u>0){
            perso.setDeplacement(Personnage.DEPLACEMENT_DEBUT+u);
        }
        //System.out.println("updated : "+PAUSE_TIME+", "+Personnage.getDeplacement());
    }
}
